package br.com.mackinvest.action;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.NoSuchElementException;
import java.util.TreeMap;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import br.com.mackinvest.business.Agencia;
import br.com.mackinvest.exceptions.DadosNaoEncontradosException;
import br.com.mackinvest.model.Cliente;
import br.com.mackinvest.model.ContaCorrente;

public class MackInvestClientesController extends MultiActionController
{
	/**
	 * Retorna todos os clientes pra View 
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	public ModelAndView listarClientes(HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		//Obtem a instancia unica da agencia
		Agencia agencia = Agencia.getInstanciaAgencia();
		HashMap<String, Object> propriedades = new HashMap<String, Object>();
		propriedades.put("acao","Clientes Cadastrados");
		if(agencia.getClientes() != null && !agencia.getClientes().isEmpty()){
			propriedades.put("lista", agencia.getClientes().values() );
		}else{
			propriedades.put("lista", null );
		}
		return new ModelAndView("clientes/lista","propriedades",propriedades);
	}
	/**
	 * Retorna a view de consulta de Clientes
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	public ModelAndView consultarClientes(HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		return new ModelAndView("clientes/consulta");
	}
	/**
	 * Faz a consulta de clientes e retorna os dados(a lista de clientes correspondentes a consulta) para a View
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	public ModelAndView fazConsultaClientes(HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		//Obtem a instancia unica da agencia
		Agencia agencia = Agencia.getInstanciaAgencia();
		String parametroConsulta = request.getParameter("textoConsulta");
		HashMap<String, Object> propriedades = new HashMap<String, Object>();
		
		propriedades.put("acao","Resultado da Consulta");
		propriedades.put("lista", agencia.getClientes(parametroConsulta));		
		
		return new ModelAndView("clientes/lista","propriedades",propriedades);
	}
	/**
	 * Retorna a view de edição de clientes passando o Cliente(model) para a view 
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	public ModelAndView editarCliente(HttpServletRequest request, HttpServletResponse response) throws DadosNaoEncontradosException
	{
		//Obtem a instancia unica da agencia
		Agencia agencia = Agencia.getInstanciaAgencia();
		int idCliente = Integer.parseInt(request.getParameter("id"));
		Cliente clienteTMP = agencia.getCliente(idCliente);
		if(clienteTMP == null){
			throw new DadosNaoEncontradosException("Cliente não encontrado!"); //Lança exceção pois não deveria ocorrer essas situação!
		}
		
		HashMap<String,Object> propriedades = new HashMap<String, Object>();
		propriedades.put("acao", "Editar");
		propriedades.put("cliente", clienteTMP);
		
		return new ModelAndView("clientes/editar","propriedades",propriedades);
	}
	/**
	 * Cria um novo cliente
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	public ModelAndView criarCliente(HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		HashMap<String,Object> propriedades = new HashMap<String, Object>();
		propriedades.put("acao", "Novo");
		propriedades.put("cliente", null);
		return new ModelAndView("clientes/editar","propriedades",propriedades);
	}
	
	/**
	 * Modifica os dados de um cliente
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	public ModelAndView modificarCliente(HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		//Obtem a instancia unica da agencia
		Agencia agencia = Agencia.getInstanciaAgencia();
		String nome = request.getParameter("nome");
		Float saldo = Float.parseFloat(request.getParameter("saldo"));
		boolean novo = request.getParameter("id") == null || request.getParameter("id").equals("");
		Cliente clienteTMP;
		int idCliente;
		
		if(novo){
			//Novo Cliente
			clienteTMP = new Cliente();
			try{
				idCliente = agencia.getClientes().lastKey() + 1;
			}catch(NoSuchElementException ex){
				idCliente = 1;
			}
			clienteTMP.setId(idCliente);
		}else{
			idCliente = Integer.parseInt(request.getParameter("id"));
			clienteTMP = agencia.getClientes().get(idCliente);
		}
		
		clienteTMP.setNome(nome);
		try{
			clienteTMP.getContaCorrente().setSaldo(saldo);
		}catch(NullPointerException ex){
			clienteTMP.setContaCorrente(new ContaCorrente());
			clienteTMP.getContaCorrente().setSaldo(saldo);
		}
		if(novo)
			agencia.addCliente(clienteTMP);
			
		return listarClientes(request, response);
	}	
	/**
	 * Faz o processo para excluir o cliente (remover investimentos,remover transacoes) 
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	public ModelAndView excluirCliente(HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		//Obtem a instancia unica da agencia
		Agencia agencia = Agencia.getInstanciaAgencia();
		int idCliente = Integer.parseInt(request.getParameter("id"));
		agencia.removeCliente(idCliente);
		
		return listarClientes(request, response);
	}	
}
